在invokeBeanFactoryPostProcessors中注册beanDefinition
invokeBeanFactoryPostProcessors ->PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors ->invokeBeanDefinitionRegistryPostProcessors ->ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(registry) ->processConfigBeanDefinitions(registry) ->ConfigurationClassBeanDefinitionReader.loadBeanDefinitions ->ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass ->loadBeanDefinitionsFromRegistrars(configClass.getImportBeanDefinitionRegistrars()) ->AspectJAutoProxyRegistrar.registerBeanDefinitions1
2
3
4
5
6
7
8
9
10
11
12
13public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);
AnnotationAttributes enableAspectJAutoProxy =
AnnotationConfigUtils.attributesFor(importingClassMetadata, EnableAspectJAutoProxy.class);
if (enableAspectJAutoProxy.getBoolean("proxyTargetClass")) {
AopConfigUtils.forceAutoProxyCreatorToUseClassProxying(registry);
}
if (enableAspectJAutoProxy.getBoolean("exposeProxy")) {
AopConfigUtils.forceAutoProxyCreatorToExposeProxy(registry);
}
}
其中AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary最终调用的方法为AopConfigUtils.registerOrEscalateApcAsRequired:
1 | private static BeanDefinition registerOrEscalateApcAsRequired(Class<?> cls, BeanDefinitionRegistry registry, Object source) { |
其中cls为AnnotationAwareAspectJAutoProxyCreator,在registry中注册AnnotationAwareAspectJAutoProxyCreator的beanDefinition,key为org.springframework.aop.config.internalAutoProxyCreator
bean创建及初始化
bean创建工作在DefaultListableBeanFactory.doCreateBean中完成:
- 调用
AbstractAutowireCapableBeanFactory.createBeanInstance创建bean实例。 - 调用
AbstractAutowireCapableBeanFactory.populateBean填充bean实例。 - 调用
AbstractAutowireCapableBeanFactory.initializeBean初始化bean实例
1 | protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) { |
重点关注applyBeanPostProcessorsAfterInitialization,它调用各个beanPostProcessor的postProcessAfterInitialization。
进入AbstractAutoProxyCreator.postProcessAfterInitialization
1 | public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { |
进入AbstractAutoProxyCreator.wrapIfNecessary,这个方法根据bean是否需要代理来包装一层代理
1 | protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) { |
createProxy
在bean初始化过程中,如果发现bean的advice不为空,则调用AbstractAutoProxyCreator.createProxy创建bean的代理
1 | protected Object createProxy(Class<?> beanClass, String beanName, Object[] specificInterceptors, TargetSource targetSource) { |
最后调用ProxyFactory.getProxy方法,该方法只有一行代码:
1 | public Object getProxy(ClassLoader classLoader) { |
初始化AopProxy
初始化AopProxy调用的是ProxyCreatorSupport.createAopProxy
1 | protected final synchronized AopProxy createAopProxy() { |
首先获取aopProxyFactory,再调用DefaultAopProxyFactory中的createAopProxy方法。这就是生成代理的入口,你会发现传入的参数是this,其实传入的就是this(ProxyCreatorSupport)的父类AdvisedSupport中的advisor等生成代理的核心参数。
Spring根据代理的目标对象是否实现了接口,来返回JdkDynamicAopProxy的动态代理或者CGLIB的代理,并且传入advisor核心参数。(JdkDynamicAopProxy这个实现了InvocationHandler,要实现invoke的关键就是传入的advisor)
1 | public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException { |
接着看JdkDynamicAopProxy:
1 | public JdkDynamicAopProxy(AdvisedSupport config) throws AopConfigException { |
将传入的AdvisedSupport赋值到advised里。
获取代理对象
回到ProxyFactory.getProxy方法,方法中先调用createAopProxy创建AopProxy,再调用getProxy获取代理对象。
以JdkDynamicAopProxy为例:
1 | public Object getProxy(ClassLoader classLoader) { |
调用Proxy.newProxyInstance创建代理类。这是java reflect包提供的原生创建代理类的方法。就是在这里,目标对象的代理对象完成了创建并返回。
回到AbstractAutowireCapableBeanFactory.initializeBean方法,wrappedBean在经过applyBeanPostProcessorsAfterInitialization处理,调用AbstractAutoProxyCreator.postProcessAfterInitialization,wrappedBean变成了一个代理类。
invoke
当调用aop代理类的方法时,调用的实际上是JdkDynamicAopProxy.invoke:
1 | public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { |
AdvisedSupport.getInterceptorsAndDynamicInterceptionAdvice
根据给定的方法,获取一个MethodInterceptor对象的列表。
1 | public List<Object> getInterceptorsAndDynamicInterceptionAdvice(Method method, Class<?> targetClass) { |
看看DefaultAdvisorChainFactory.getInterceptorsAndDynamicInterceptionAdvice方法:
1 | public List<Object> getInterceptorsAndDynamicInterceptionAdvice(Advised config, Method method, Class<?> targetClass) { |
ReflectiveMethodInvocation.proceed
1 | public Object proceed() throws Throwable { |
参考: